/*************************************************************************
    > File Name: RSA.h
    > Author: ZhaoLulu@BJTU
    > E-mail: 19281121@bjtu.edu.cn
    > Created Time: 2021年11月17日 星期三
 ************************************************************************/
#ifndef INC_19281121_5_RSA_RSA_H
#define INC_19281121_5_RSA_RSA_H

#include <iostream>
#include <ctime>
#include <string>
#include <gmp.h>

#define KEY_LENGTH 2048
#define BASE 16
#define E 65537

struct key_pair {
    char *n;
    char *d;
    int e;
};

void mod_exp(mpz_t result, const mpz_t base, const mpz_t exponent, const mpz_t n);

int miller_rabin(mpz_srcptr n, mpz_srcptr nm1, mpz_ptr x, mpz_ptr y, mpz_srcptr q, unsigned long int k);

int Miller_Rabin(mpz_srcptr n, int reps);

mpz_t *generate_primes();

void generate_d(mpz_t e, mpz_t phi, mpz_t *temp, mpz_t *a, mpz_t *b);

key_pair *generate_key_pair();

char *encrypt(const char *plaintext, const char *key_n, int key_e);

char *decrypt(const char *ciphertext, const char *key_n, const char *key_d);

#endif //INC_19281121_5_RSA_RSA_H
